/**
 * 材质配置文件辅助函数
 * ✅ 新架构：使用 displayName 作为唯一标识，不再使用 id 和 name
 * 每个材质独立保存配置文件，文件名为 displayName 的安全编码
 */

const fs = require('fs').promises;
const fsSync = require('fs');
const path = require('path');

/**
 * 将材质显示名编码为安全的文件名
 * @param {string} displayName - 材质显示名称
 * @returns {string} 安全的文件名
 */
function encodeMaterialFileName(displayName) {
    // 使用 Base64 编码确保文件名安全（适用于所有操作系统）
    return Buffer.from(displayName, 'utf-8').toString('base64').replace(/[/+=]/g, '_');
}

/**
 * 将文件名解码为材质显示名
 * @param {string} fileName - 编码后的文件名
 * @returns {string} 材质显示名称
 */
function decodeMaterialFileName(fileName) {
    const base64 = fileName.replace(/_/g, '/');
    return Buffer.from(base64, 'base64').toString('utf-8');
}

/**
 * 读取单个材质的完整配置
 * @param {string} materialsDir - 材质目录路径
 * @param {string} displayName - 材质显示名称
 * @returns {Promise<Object|null>} 材质配置对象，如果不存在返回null
 */
async function readMaterialConfig(materialsDir, displayName) {
    const fileName = encodeMaterialFileName(displayName);
    const configPath = path.join(materialsDir, `${fileName}.json`);
    
    try {
        const data = await fs.readFile(configPath, 'utf-8');
        return JSON.parse(data);
    } catch (error) {
        return null;
    }
}

/**
 * 写入单个材质的完整配置
 * @param {string} materialsDir - 材质目录路径
 * @param {string} displayName - 材质显示名称
 * @param {Object} materialData - 材质配置数据
 */
async function writeMaterialConfig(materialsDir, displayName, materialData) {
    const fileName = encodeMaterialFileName(displayName);
    const configPath = path.join(materialsDir, `${fileName}.json`);
    materialData.updatedAt = new Date().toISOString();
    await fs.writeFile(configPath, JSON.stringify(materialData, null, 2), 'utf-8');
}

/**
 * 删除单个材质的配置文件
 * @param {string} materialsDir - 材质目录路径
 * @param {string} displayName - 材质显示名称
 */
async function deleteMaterialConfig(materialsDir, displayName) {
    const fileName = encodeMaterialFileName(displayName);
    const configPath = path.join(materialsDir, `${fileName}.json`);
    
    try {
        await fs.unlink(configPath);
    } catch (error) {
        // 文件可能不存在，忽略错误
    }
}

/**
 * 获取所有材质的完整配置（从各自的配置文件）
 * @param {string} materialsDir - 材质目录路径
 * @returns {Promise<Array>} 材质配置数组
 */
async function getAllMaterials(materialsDir) {
    try {
        // 确保目录存在
        if (!fsSync.existsSync(materialsDir)) {
            return [];
        }
        
        // 读取目录中的所有文件
        const files = await fs.readdir(materialsDir);
        const materials = [];
        
        // 遍历所有 .json 文件
        for (const file of files) {
            if (file.endsWith('.json')) {
                try {
                    const configPath = path.join(materialsDir, file);
                    const data = await fs.readFile(configPath, 'utf-8');
                    const materialConfig = JSON.parse(data);
                    
                    // ✅ 确保有 displayName 字段
                    if (materialConfig.displayName) {
                        materials.push(materialConfig);
                    }
                } catch (error) {
                    console.warn(`⚠️ 读取材质配置失败 (${file}):`, error.message);
                }
            }
        }
        
        // 按创建时间排序
        materials.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt));
        
        return materials;
    } catch (error) {
        console.error('❌ 获取材质列表失败:', error);
        return [];
    }
}

/**
 * 按显示名称查找材质
 * @param {string} materialsDir - 材质目录路径
 * @param {string} displayName - 材质显示名称
 * @returns {Promise<Object|null>} 找到的材质配置对象
 */
async function findMaterialByDisplayName(materialsDir, displayName) {
    // 直接读取文件（比遍历所有材质更高效）
    return await readMaterialConfig(materialsDir, displayName);
}

module.exports = {
    readMaterialConfig,
    writeMaterialConfig,
    deleteMaterialConfig,
    getAllMaterials,
    findMaterialByDisplayName,
    encodeMaterialFileName,
    decodeMaterialFileName
};

